#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <iostream>
#include <iostream>  // C++ 输入输出流（用于 std::cout）
#include <cstdio>    // C 标准输入输出（用于 getchar()）
#include <pthread.h> // POSIX 线程库，提供线程、互斥锁、条件变量等功能

// int count = 0;
// void *Routine(void *args)
// {
//     while (1)
//     {
//         count++;
//         sleep(1);
//     }
//     pthread_exit((void *)0);
// }
// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, Routine, nullptr);
//     while (1)
//     {
//         printf("count:%d\n", count);
//         sleep(1);
//     }
//     pthread_join(tid, nullptr);
//     return 0;
// }

//_________________________________________________________
// int tickets = 1000;
// pthread_mutex_t mutex;
// void *TicketGrabbing(void *args)
// {
//     const char *name = (char *)args;
//     while (1)
//     {
//         pthread_mutex_lock(&mutex);
//         if (tickets > 0)
//         {
//             usleep(10000); // 模拟购票延迟
//             printf("[%s] get a ticket,left:%d\n", name, --tickets);
//             pthread_mutex_unlock(&mutex);
//         }
//         else
//         {
//             pthread_mutex_unlock(&mutex);
//             break;
//         }
//     }
//     printf("%s quit\n", name);
//     pthread_exit((void *)0);
// }
// int main()
// {
//     pthread_mutex_init(&mutex, nullptr);
//     pthread_t t1, t2, t3, t4;
//     pthread_create(&t1, nullptr, TicketGrabbing, (void *)"thread-1");
//     pthread_create(&t2, nullptr, TicketGrabbing, (void *)"thread-2");
//     pthread_create(&t3, nullptr, TicketGrabbing, (void *)"thread-3");
//     pthread_create(&t4, nullptr, TicketGrabbing, (void *)"thread-4");
//     pthread_join(t1, nullptr);
//     pthread_join(t2, nullptr);
//     pthread_join(t3, nullptr);
//     pthread_join(t4, nullptr);
//     pthread_mutex_destroy(&mutex); // 销毁互斥锁
//     return 0;
// }

//_________________________________________________________
// 互斥量封装后的 抢票系统
// #include "Lock.hpp"
// using namespace LockModule;
// int ticket = 1000;
// Mutex mutex;
// void *route(void *arg)
// {
//     const char *id = (char *)arg;
//     while (true)
//     {
//         LockGuard lockguard(mutex);
//         if (ticket > 0)
//         {
//             usleep(1000);
//             printf("[%s] get a ticket,left:%d\n", id, --ticket);
//             if (ticket == 0)
//             {
//                 break;
//             }
//         }
//         else
//         {
//             break;
//         }
//         // sleep(1);
//     }
//     printf("%s finished selling tickets\n", id);
//     return nullptr;
// }
// int main()
// {
//     pthread_t t1, t2, t3, t4;
//     pthread_create(&t1, nullptr, route, (void *)"thread-1");
//     pthread_create(&t2, nullptr, route, (void *)"thread-2");
//     pthread_create(&t3, nullptr, route, (void *)"thread-3");
//     pthread_create(&t4, nullptr, route, (void *)"thread-4");
//     pthread_join(t1, nullptr);
//     pthread_join(t2, nullptr);
//     pthread_join(t3, nullptr);
//     pthread_join(t4, nullptr);
//     printf("all threads finished\n,final ticket count:%d\n", ticket);
//     return 0;
// }

//____________________________________________________________________________________________

// 条件变量1
// pthread_cond_t cond;
// pthread_mutex_t mutex;
// void *r1(void *arg)
// {
//     while (1)
//     {
//         pthread_cond_wait(&cond, &mutex);
//         printf("活动\n");
//     }
// }
// void *r2(void *arg)
// {
//     while (1)
//     {
//         pthread_cond_signal(&cond);
//         sleep(1);
//     }
// }

// int main(void)
// {
//     pthread_t t1, t2;
//     pthread_cond_init(&cond, nullptr);
//     pthread_mutex_init(&mutex, nullptr);

//     pthread_create(&t1, nullptr, r1, nullptr);
//     pthread_create(&t2, nullptr, r2, nullptr);

//     // 等待线程结束（主线程在此阻塞，直到t1和t2退出）
//     pthread_join(t1, nullptr);
//     pthread_join(t2, nullptr);

//     pthread_cond_destroy(&cond);
//     pthread_mutex_destroy(&mutex);
//     return 0;
// }

//____________________________________________________________________________________________
// 条件变量2

// pthread_cond_t cond;
// pthread_mutex_t mutex;
// void *Rountine(void *arg)
// {
//     pthread_detach(pthread_self());
//     std::cout << (char *)arg << "run.." << std::endl;
//     while (true)
//     {
//         pthread_cond_wait(&cond, &mutex);
//         // pthread_cond_broadcast(&cond);
//         std::cout << (char *)arg << "活动" << std::endl;
//     }
// }
// int main()
// {
//     pthread_t t1, t2, t3;
//     pthread_mutex_init(&mutex, nullptr);
//     pthread_cond_init(&cond, nullptr);

//     pthread_create(&t1, nullptr, Rountine, (void *)"thread-1");
//     pthread_create(&t2, nullptr, Rountine, (void *)"thread-2");
//     pthread_create(&t3, nullptr, Rountine, (void *)"thread-3");

//     while (true)
//     {
//         getchar();
//         pthread_cond_signal(&cond);
//         sleep(1); // 新增延迟，确保单次唤醒
//     }
//     pthread_cond_destroy(&cond);
//     pthread_mutex_destroy(&mutex);
//     return 0;
// }